package peace.design.command
{
import flash.events.Event;
import flash.events.EventDispatcher;
	
	
[Event (name="complete", type="flash.events.Event")] 
/**
 * Простая реализация команды. <br>
 * Разумно инкапсулировать в команду обработку определённого действия. 
 */	
public class Command extends EventDispatcher
{
	/**
	 * кеш против удаления команд GC-ом на этапе выполнения 
	 */	
	private static var cache:Array = [];
	/**
	 * Выполнена ли команда.
	 */
	public var complete:Boolean = false;
	
	public function Command()
	{
	}
	
	/**
	 * virtual
	 * 
	 * Получаем доступ к нужному нам сервису и шлём реквест
	 */
	public function execute ():void
	{
		// кешируем команду
		if (cache.indexOf(this)==-1)
		{
			cache.push(this);
		}
		
		complete = false;
	}

	/**
	 * для команд, которые не требуют вызова сервиса, дергаем метод вручную
	 */
	protected function notifyComplete ():void
	{
		// шлём событие окончания выполнения команды
		dispatchEvent(new Event(Event.COMPLETE));
		complete = true;
		
		// убираем из кеша 
		var index:int = cache.indexOf(this);
		if (index > -1)
		{
			cache.splice(index, 1);
		}
	}

}
}